package com.example.foo.ftt.service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.core.PageResult;
import com.example.core.Pageable;
import com.example.foo.ftt.model.FttProfit;
import com.example.foo.ftt.query.FttProfitQuery;
import com.example.foo.ftt.FttLevel;
import com.example.foo.ftt.FttProfitException;
import com.example.foo.ftt.dao.FttProfitDao;

@org.springframework.stereotype.Service
public class FttProfitService {

	private final FttProfitDao fttProfitDao;

	public FttProfitService(FttProfitDao fttProfitDao) {
		this.fttProfitDao = fttProfitDao;
	}

	// ========== FttProfit ==========

	public PageResult<FttProfit> findFttProfits(FttProfitQuery fttProfitQuery, Pageable pageable) {
		return fttProfitDao.findFttProfits(fttProfitQuery, pageable);
	}

	public List<FttProfit> findFttProfitsByIds(List<Long> ids) {
		return fttProfitDao.selectBatchIds(ids);
	}

	public FttProfit findFttProfitById(Long id) {
		return fttProfitDao.selectById(id);
	}

	public FttProfit findFttProfitByFttLevelAndPeriodDay(FttLevel fttLevel, Integer periodDay) {
		return fttProfitDao.selectOne(new QueryWrapper<FttProfit>()
				.eq("ftt_level", fttLevel)
				.eq("period_day", periodDay)
				);
	}

	public void createFttProfitPending(FttLevel fttLevel, BigDecimal totalMoney, Integer periodDay) {
		FttProfit fttProfit = new FttProfit();
		fttProfit.setFttLevel(fttLevel);
		fttProfit.setTotalMoney(totalMoney);
		fttProfit.setPeriodDay(periodDay);
		fttProfit.setState(FttProfit.State.pending);
		fttProfit.setUserCount(0);
		fttProfit.setPerUserMoney(BigDecimal.ZERO);
		fttProfit.setCreatedAt(LocalDateTime.now());
		fttProfitDao.insert(fttProfit);
	}

	public void updateFttProfitIncrement(Long id, BigDecimal totalMoney) {
		FttProfit fttProfit = new FttProfit();
		fttProfit.setId(id);
		fttProfit.setTotalMoney(totalMoney);
		fttProfit.setUpdatedAt(LocalDateTime.now());
		fttProfitDao.updateFttProfitTotalMoneyIncrement(fttProfit);
	}

	public void updateFttProfitSuccess(Long id, Integer userCount, BigDecimal perUserMoney) {
		FttProfit fttProfit = fttProfitDao.selectById(id);
		if (fttProfit.getState() != FttProfit.State.pending) {
			throw new FttProfitException(String.format("FttProfit#%s 状态错误: %s", fttProfit.getId(), fttProfit.getState().text));
		}

		fttProfit.setState(FttProfit.State.success);
		fttProfit.setUserCount(userCount);
		fttProfit.setPerUserMoney(perUserMoney);
		fttProfit.setUpdatedAt(LocalDateTime.now());
		fttProfitDao.updateById(fttProfit);
	}

	public void updateFttProfitFailure(Long id) {
		FttProfit fttProfit = fttProfitDao.selectById(id);
		if (fttProfit.getState() != FttProfit.State.pending) {
			throw new FttProfitException(String.format("FttProfit#%s 状态错误: %s", fttProfit.getId(), fttProfit.getState().text));
		}

		fttProfit.setState(FttProfit.State.failure);
		fttProfit.setUpdatedAt(LocalDateTime.now());
		fttProfitDao.updateById(fttProfit);
	}

}
